home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir42 / gnudbm14.zip / UPDATE.C < prev    next >
C/C++ Source or Header  |  1990-08-24  |  4KB  |  149 lines

  1. /* update.c - The routines for updating the file to a consistent state. */
  2.  
  3. /*  This file is part of GDBM, the GNU data base manager, by Philip A. Nelson.
  4.     Copyright (C) 1990  Free Software Foundation, Inc.
  5.  
  6.     GDBM is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 1, or (at your option)
  9.     any later version.
  10.  
  11.     GDBM is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with GDBM; see the file COPYING.  If not, write to
  18.     the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.     You may contact the author by:
  21.        e-mail:  phil@wwu.edu
  22.       us-mail:  Philip A. Nelson
  23.                 Computer Science Department
  24.                 Western Washington University
  25.                 Bellingham, WA 98226
  26.         phone:  (206) 676-3035
  27.        
  28. *************************************************************************/
  29.  
  30. /*
  31.  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@@ddagsi3.bitnet
  32.  *
  33.  * To this port, the same copying conditions apply as to the
  34.  * original release.
  35.  *
  36.  * IMPORTANT:
  37.  * This file is not identical to the original GNU release!
  38.  * You should have received this code as patch to the official
  39.  * GNU release.
  40.  *
  41.  * MORE IMPORTANT:
  42.  * This port comes with ABSOLUTELY NO WARRANTY.
  43.  *
  44.  * $Header: e:/gnu/gdbm/RCS/update.c'v 1.4.0.1 90/08/16 09:22:53 tho Exp $
  45.  */
  46.  
  47. #include <stdio.h>
  48. #include <sys/types.h>
  49. #ifndef MSDOS
  50. #include <sys/file.h>
  51. #endif /* not MSDOS */
  52. #include "gdbmdefs.h"
  53. #include "systems.h"
  54.  
  55. #ifdef __STDC__
  56. static void write_header (gdbm_file_info *dbf);
  57. #endif /* __STDC__ */
  58.  
  59. /* This procedure writes the header back to the file described by DBF. */
  60.  
  61. static VOID
  62. write_header (dbf)
  63.      gdbm_file_info *dbf;
  64. {
  65.   LONG num_bytes;
  66.  
  67.   num_bytes = lseek (dbf->desc, (LONG) 0, L_SET);
  68.   if (num_bytes != 0) _gdbm_fatal (dbf, "lseek error");
  69. #ifdef MSDOS
  70.   num_bytes = write (dbf->desc, (char *) dbf->header, dbf->header->block_size);
  71. #else /* not MSDOS */
  72.   num_bytes = write (dbf->desc, dbf->header, dbf->header->block_size);
  73. #endif /* not MSDOS */
  74.   if (num_bytes != dbf->header->block_size)
  75.     _gdbm_fatal (dbf, "write error");
  76.  
  77.   /* Wait for all output to be done. */
  78.   fsync (dbf->desc);
  79. }
  80.  
  81.  
  82. /* After all changes have been made in memory, we now write them
  83.    all to disk. */
  84. VOID
  85. _gdbm_end_update (dbf)
  86.      gdbm_file_info *dbf;
  87. {
  88.   LONG num_bytes;    /* Return value for lseek and write. */
  89.   
  90.   /* Write the current bucket. */
  91.   if (dbf->bucket_changed)
  92.     {
  93.       _gdbm_write_bucket (dbf, dbf->cache_entry);
  94.       dbf->bucket_changed = FALSE;
  95.     }
  96.  
  97.   /* Write the other changed buckets if there are any. */
  98.   if (dbf->second_changed)
  99.     {
  100.       int index;
  101.  
  102.       for (index = 0; index < CACHE_SIZE; index++)
  103.     if (dbf->bucket_cache[index].ca_changed)
  104.       {
  105.         _gdbm_write_bucket (dbf, &dbf->bucket_cache[index]);
  106.       }
  107.       dbf->second_changed = FALSE;
  108.     }
  109.   
  110.   /* Write the directory. */
  111.   if (dbf->directory_changed)
  112.     {
  113.       num_bytes = lseek (dbf->desc, dbf->header->dir, L_SET);
  114.       if (num_bytes != dbf->header->dir) _gdbm_fatal (dbf, "lseek error");
  115. #ifdef MSDOS            /* shut up the compiler!  */
  116.       num_bytes = write (dbf->desc, (char *) dbf->dir, dbf->header->dir_size);
  117. #else /* not MSDOS */
  118.       num_bytes = write (dbf->desc, dbf->dir, dbf->header->dir_size);
  119. #endif /* not MSDOS */
  120.       if (num_bytes != dbf->header->dir_size)
  121.     _gdbm_fatal (dbf, "write error");
  122.       dbf->directory_changed = FALSE;
  123.       if (!dbf->header_changed) fsync (dbf->desc);
  124.     }
  125.  
  126.   /* Final write of the header. */
  127.   if (dbf->header_changed)
  128.     {
  129.       write_header (dbf);
  130.       dbf->header_changed = FALSE;
  131.     }
  132. }
  133.  
  134.  
  135. /* If a fatal error is detected, come here and exit. VAL tells which fatal
  136.    error occured. */
  137. VOID
  138. _gdbm_fatal (dbf, val)
  139.      gdbm_file_info *dbf;
  140.      char *val;
  141. {
  142.   if (dbf->fatal_err != NULL)
  143.     (*dbf->fatal_err) (val);
  144.   else
  145.     fprintf (stderr, "gdbm fatal: %s.\n", val);
  146.   exit (-1);
  147. }
  148.  
  149.